package com.algorithm.ch1.cjm.other;

/**
 * 颠倒二进制位
 * 颠倒给定的 32 位无符号整数的二进制位。
 * <p>
 * 示例:
 * <p>
 * 输入: 43261596
 * 输出: 964176192
 * 解释: 43261596 的二进制表示形式为  0000 0010 1001 0100 0001 1110 1001 1100 ，
 * 返回 964176192，其二进制表示形式为 0011 1001 0111 1000 0010 1001 0100 0000 。
 * 进阶:
 * 如果多次调用这个函数，你将如何优化你的算法？
 *
 * @Author: Jie Ming Chen
 * @Date: 2018/9/16
 * @Version 1.0
 */
public class ReverseBits {

    /**
     * a | b 操作，可以理解成➕
     * @param n
     * @return
     */
    public int reverseBits(int n) {

        int m = 0;
        for (int i = 0; i < 32; i++) {

            m <<= 1;
            int r = n & 1;

            m = m | r;

            n = n >> 1;
        }
        return m;
    }

    public static void main(String[] args) {
        int i = new ReverseBits().reverseBits(3);

        System.out.println(i);
    }
}
